/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import Logica.Vehiculo;
import Logica.Taller;
import Logica.Diagnostico;
import Logica.EstadoVehiculo;
import Logica.ReparacionEnEjecucion;
import Persistencia.exceptions.NonexistentEntityException;
import Persistencia.exceptions.PreexistingEntityException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author Pablo
 */
public class ReparacionEnEjecucionJpaController implements Serializable {
    
    public ReparacionEnEjecucionJpaController() {
        this.emf = Persistence.createEntityManagerFactory("TpFinalPU");
    }

    public ReparacionEnEjecucionJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(ReparacionEnEjecucion reparacionEnEjecucion) throws PreexistingEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Vehiculo unVehiculo = reparacionEnEjecucion.getUnVehiculo();
            if (unVehiculo != null) {
                unVehiculo = em.getReference(unVehiculo.getClass(), unVehiculo.getNroChasis());
                reparacionEnEjecucion.setUnVehiculo(unVehiculo);
            }
            Taller unTaller = reparacionEnEjecucion.getUnTaller();
            if (unTaller != null) {
                unTaller = em.getReference(unTaller.getClass(), unTaller.getNroTaller());
                reparacionEnEjecucion.setUnTaller(unTaller);
            }
            Diagnostico unDiagnostico = reparacionEnEjecucion.getUnDiagnostico();
            if (unDiagnostico != null) {
                unDiagnostico = em.getReference(unDiagnostico.getClass(), unDiagnostico.getNroDiagnostico());
                reparacionEnEjecucion.setUnDiagnostico(unDiagnostico);
            }
            EstadoVehiculo unEstadoEntrada = reparacionEnEjecucion.getUnEstadoEntrada();
            if (unEstadoEntrada != null) {
                unEstadoEntrada = em.getReference(unEstadoEntrada.getClass(), unEstadoEntrada.getCodigoEstado());
                reparacionEnEjecucion.setUnEstadoEntrada(unEstadoEntrada);
            }
            EstadoVehiculo unEstadoSalida = reparacionEnEjecucion.getUnEstadoSalida();
            if (unEstadoSalida != null) {
                unEstadoSalida = em.getReference(unEstadoSalida.getClass(), unEstadoSalida.getCodigoEstado());
                reparacionEnEjecucion.setUnEstadoSalida(unEstadoSalida);
            }
            em.persist(reparacionEnEjecucion);
            if (unVehiculo != null) {
                unVehiculo.getReparacionesEnEjecucion().add(reparacionEnEjecucion);
                unVehiculo = em.merge(unVehiculo);
            }
            if (unTaller != null) {
                unTaller.getReparacionesEnEjecucion().add(reparacionEnEjecucion);
                unTaller = em.merge(unTaller);
            }
            if (unDiagnostico != null) {
                ReparacionEnEjecucion oldUnaReparacionEnEjecucionOfUnDiagnostico = unDiagnostico.getUnaReparacionEnEjecucion();
                if (oldUnaReparacionEnEjecucionOfUnDiagnostico != null) {
                    oldUnaReparacionEnEjecucionOfUnDiagnostico.setUnDiagnostico(null);
                    oldUnaReparacionEnEjecucionOfUnDiagnostico = em.merge(oldUnaReparacionEnEjecucionOfUnDiagnostico);
                }
                unDiagnostico.setUnaReparacionEnEjecucion(reparacionEnEjecucion);
                unDiagnostico = em.merge(unDiagnostico);
            }
            if (unEstadoEntrada != null) {
                unEstadoEntrada.setReparacionesEnEjecucion(reparacionEnEjecucion);
                unEstadoEntrada = em.merge(unEstadoEntrada);
            }
            if (unEstadoSalida != null) {
                unEstadoSalida.setReparacionesEnEjecucion(reparacionEnEjecucion);
                unEstadoSalida = em.merge(unEstadoSalida);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findReparacionEnEjecucion(reparacionEnEjecucion.getNroReparacionEnEjecucion()) != null) {
                throw new PreexistingEntityException("ReparacionEnEjecucion " + reparacionEnEjecucion + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(ReparacionEnEjecucion reparacionEnEjecucion) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ReparacionEnEjecucion persistentReparacionEnEjecucion = em.find(ReparacionEnEjecucion.class, reparacionEnEjecucion.getNroReparacionEnEjecucion());
            Vehiculo unVehiculoOld = persistentReparacionEnEjecucion.getUnVehiculo();
            Vehiculo unVehiculoNew = reparacionEnEjecucion.getUnVehiculo();
            Taller unTallerOld = persistentReparacionEnEjecucion.getUnTaller();
            Taller unTallerNew = reparacionEnEjecucion.getUnTaller();
            Diagnostico unDiagnosticoOld = persistentReparacionEnEjecucion.getUnDiagnostico();
            Diagnostico unDiagnosticoNew = reparacionEnEjecucion.getUnDiagnostico();
            EstadoVehiculo unEstadoEntradaOld = persistentReparacionEnEjecucion.getUnEstadoEntrada();
            EstadoVehiculo unEstadoEntradaNew = reparacionEnEjecucion.getUnEstadoEntrada();
            EstadoVehiculo unEstadoSalidaOld = persistentReparacionEnEjecucion.getUnEstadoSalida();
            EstadoVehiculo unEstadoSalidaNew = reparacionEnEjecucion.getUnEstadoSalida();
            if (unVehiculoNew != null) {
                unVehiculoNew = em.getReference(unVehiculoNew.getClass(), unVehiculoNew.getNroChasis());
                reparacionEnEjecucion.setUnVehiculo(unVehiculoNew);
            }
            if (unTallerNew != null) {
                unTallerNew = em.getReference(unTallerNew.getClass(), unTallerNew.getNroTaller());
                reparacionEnEjecucion.setUnTaller(unTallerNew);
            }
            if (unDiagnosticoNew != null) {
                unDiagnosticoNew = em.getReference(unDiagnosticoNew.getClass(), unDiagnosticoNew.getNroDiagnostico());
                reparacionEnEjecucion.setUnDiagnostico(unDiagnosticoNew);
            }
            if (unEstadoEntradaNew != null) {
                unEstadoEntradaNew = em.getReference(unEstadoEntradaNew.getClass(), unEstadoEntradaNew.getCodigoEstado());
                reparacionEnEjecucion.setUnEstadoEntrada(unEstadoEntradaNew);
            }
            if (unEstadoSalidaNew != null) {
                unEstadoSalidaNew = em.getReference(unEstadoSalidaNew.getClass(), unEstadoSalidaNew.getCodigoEstado());
                reparacionEnEjecucion.setUnEstadoSalida(unEstadoSalidaNew);
            }
            reparacionEnEjecucion = em.merge(reparacionEnEjecucion);
            if (unVehiculoOld != null && !unVehiculoOld.equals(unVehiculoNew)) {
                unVehiculoOld.getReparacionesEnEjecucion().remove(reparacionEnEjecucion);
                unVehiculoOld = em.merge(unVehiculoOld);
            }
            if (unVehiculoNew != null && !unVehiculoNew.equals(unVehiculoOld)) {
                unVehiculoNew.getReparacionesEnEjecucion().add(reparacionEnEjecucion);
                unVehiculoNew = em.merge(unVehiculoNew);
            }
            if (unTallerOld != null && !unTallerOld.equals(unTallerNew)) {
                unTallerOld.getReparacionesEnEjecucion().remove(reparacionEnEjecucion);
                unTallerOld = em.merge(unTallerOld);
            }
            if (unTallerNew != null && !unTallerNew.equals(unTallerOld)) {
                unTallerNew.getReparacionesEnEjecucion().add(reparacionEnEjecucion);
                unTallerNew = em.merge(unTallerNew);
            }
            if (unDiagnosticoOld != null && !unDiagnosticoOld.equals(unDiagnosticoNew)) {
                unDiagnosticoOld.setUnaReparacionEnEjecucion(null);
                unDiagnosticoOld = em.merge(unDiagnosticoOld);
            }
            if (unDiagnosticoNew != null && !unDiagnosticoNew.equals(unDiagnosticoOld)) {
                ReparacionEnEjecucion oldUnaReparacionEnEjecucionOfUnDiagnostico = unDiagnosticoNew.getUnaReparacionEnEjecucion();
                if (oldUnaReparacionEnEjecucionOfUnDiagnostico != null) {
                    oldUnaReparacionEnEjecucionOfUnDiagnostico.setUnDiagnostico(null);
                    oldUnaReparacionEnEjecucionOfUnDiagnostico = em.merge(oldUnaReparacionEnEjecucionOfUnDiagnostico);
                }
                unDiagnosticoNew.setUnaReparacionEnEjecucion(reparacionEnEjecucion);
                unDiagnosticoNew = em.merge(unDiagnosticoNew);
            }
            if (unEstadoEntradaOld != null && !unEstadoEntradaOld.equals(unEstadoEntradaNew)) {
                //unEstadoEntradaOld.getReparacionesEnEjecucion()
                em.remove(unEstadoEntradaOld.getReparacionesEnEjecucion());
                unEstadoEntradaOld = em.merge(unEstadoEntradaOld);
            }
            if (unEstadoEntradaNew != null && !unEstadoEntradaNew.equals(unEstadoEntradaOld)) {
                unEstadoEntradaNew.setReparacionesEnEjecucion(reparacionEnEjecucion);
                unEstadoEntradaNew = em.merge(unEstadoEntradaNew);
            }
            if (unEstadoSalidaOld != null && !unEstadoSalidaOld.equals(unEstadoSalidaNew)) {
                em.remove(unEstadoEntradaOld.getReparacionesEnEjecucion());
                unEstadoSalidaOld = em.merge(unEstadoSalidaOld);
            }
            if (unEstadoSalidaNew != null && !unEstadoSalidaNew.equals(unEstadoSalidaOld)) {
                unEstadoSalidaNew.setReparacionesEnEjecucion(reparacionEnEjecucion);
                unEstadoSalidaNew = em.merge(unEstadoSalidaNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                int id = reparacionEnEjecucion.getNroReparacionEnEjecucion();
                if (findReparacionEnEjecucion(id) == null) {
                    throw new NonexistentEntityException("The reparacionEnEjecucion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(int id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ReparacionEnEjecucion reparacionEnEjecucion;
            try {
                reparacionEnEjecucion = em.getReference(ReparacionEnEjecucion.class, id);
                reparacionEnEjecucion.getNroReparacionEnEjecucion();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The reparacionEnEjecucion with id " + id + " no longer exists.", enfe);
            }
            Vehiculo unVehiculo = reparacionEnEjecucion.getUnVehiculo();
            if (unVehiculo != null) {
                unVehiculo.getReparacionesEnEjecucion().remove(reparacionEnEjecucion);
                unVehiculo = em.merge(unVehiculo);
            }
            Taller unTaller = reparacionEnEjecucion.getUnTaller();
            if (unTaller != null) {
                unTaller.getReparacionesEnEjecucion().remove(reparacionEnEjecucion);
                unTaller = em.merge(unTaller);
            }
            Diagnostico unDiagnostico = reparacionEnEjecucion.getUnDiagnostico();
            if (unDiagnostico != null) {
                unDiagnostico.setUnaReparacionEnEjecucion(null);
                unDiagnostico = em.merge(unDiagnostico);
            }
            EstadoVehiculo unEstadoEntrada = reparacionEnEjecucion.getUnEstadoEntrada();
            if (unEstadoEntrada != null) {
                em.remove(unEstadoEntrada.getReparacionesEnEjecucion());
                unEstadoEntrada = em.merge(unEstadoEntrada);
            }
            EstadoVehiculo unEstadoSalida = reparacionEnEjecucion.getUnEstadoSalida();
            if (unEstadoSalida != null) {
                em.remove(unEstadoSalida.getReparacionesEnEjecucion());
                unEstadoSalida = em.merge(unEstadoSalida);
            }
            em.remove(reparacionEnEjecucion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<ReparacionEnEjecucion> findReparacionEnEjecucionEntities() {
        return findReparacionEnEjecucionEntities(true, -1, -1);
    }

    public List<ReparacionEnEjecucion> findReparacionEnEjecucionEntities(int maxResults, int firstResult) {
        return findReparacionEnEjecucionEntities(false, maxResults, firstResult);
    }

    private List<ReparacionEnEjecucion> findReparacionEnEjecucionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(ReparacionEnEjecucion.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public ReparacionEnEjecucion findReparacionEnEjecucion(int id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(ReparacionEnEjecucion.class, id);
        } finally {
            em.close();
        }
    }

    public int getReparacionEnEjecucionCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<ReparacionEnEjecucion> rt = cq.from(ReparacionEnEjecucion.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
